<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /* const obj = {
      age: 18,
    }

    Object.defineProperty(obj, 'sex', {
      // enumerable: true, // 可枚举，可以被 for in 循环出来，或 Object.keys 拿出来
      value: '男',
    })
    console.log(obj)

    console.log(Object.keys(obj)) */

    /* const obj = {
  age: 18,
}

// 通过 Object.defineProperty 定义对象的属性的时候，通过 enumerable 可以执行是否能够被 for in 循环出来
// 能被 for in 循环出来的就是可枚举的属性
Object.defineProperty(obj, 'sex', {
  // enumerable: false,
  value: '男',
})
console.log(obj)

console.log(Object.keys(obj)) */

    // for in 和 Object.keys() 的区别

    Object.prototype.age = 18
    const obj = {
      sex: '男',
    }

    // 同一原型链上的也能遍历出来，有时候往往不是我们期望的
    /* for (let attr in obj) {
      console.log(attr)
    } */

    // 建议
    /* for (let attr in obj) {
      if (obj.hasOwnProperty(attr)) {
        console.log(attr)
      }
    } */

    // 拿到的只有自身的
    console.log(Object.keys(obj))


  </script>
</body>

</html>